<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"
    />
    <title>代理模式</title>
    <style lang="css">
        .preload {
            display: block;
            width: 160px;
            height: 160px;
        }
    </style>
</head>

<body>
    <h2>缓存代理</h2>
    <p>缓存代理可以为一些开销大的运算结果提供暂时的存储，在下次运算时，如果传递进来的参 数跟之前一致，则可以直接返回前面存储的运算结果。</p>
    <p>例子：计算乘积</p>
    <p>缓存代理用于ajax异步请求数据 我们在常常在项目中遇到分页的需求，同一页的数据理论上只需要去后台拉取一次，这些已 经拉取到的数据在某个地方被缓存之后，下次再请求同一页的时候，便可以直接使用之前的数据。 显然这里也可以引入缓存代理，实现方式跟计算乘积的例子差不多，唯一不同的是，请求数
    据是个异步的操作，我们无法直接把计算结果放到代理对象的缓存中，而是要通过回调的方式。 具体代码不再赘述，读者可以自行实现。</p>
    <script type="text/javascript">
        var mult = function () {
            var result = 1
            for (var i = 0; i < arguments.length; i++) {
                result = result * arguments[i]
            }
            console.log('计算中...')
            return result
        }
        var proxyMult = (function () {
            var caches = {}
            return function () {
                var args = Array.prototype.join.call(arguments, ',')
                if (args in caches) {
                    return caches[args]
                }
                caches[args] = mult.apply(this, arguments)
                return caches[args]
            }

        })()
        // 一共计算了3次
        var test1 = proxyMult(2, 3)
        var test2 = proxyMult(2, 3, 4)
        var test3 = proxyMult(2, 3, 4)
        var test3 = proxyMult(2, 3, 4)
        var test3 = proxyMult(2, 3, 4)
        var test3 = proxyMult(2, 3, 4, 5)
        console.log(test1)
        console.log(test2)
        console.log(test3)

    </script>

</body>

</html>